package com.zyz.study.controller;
import dev.langchain4j.data.message.ImageContent;
import dev.langchain4j.data.message.TextContent;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Base64;

@RestController // 标记该类为Rest风格的控制器，返回的数据会自动序列化为JSON格式
@RequestMapping("/qwen3images")// 映射所有请求方式的 /ollamachat 路径
@Tag(name = "云端qwen3处理图片")  // Swagger注解，给该控制器的接口打上“用户管理”标签，便于文档分组显示
public class QwenVLMaxController {

    @Resource(name = "QwenVL_Max_2025_04_08_chatModel")
    private ChatModel QwenVLMaxchatModel;


    @Value("classpath:image/pic2.png")
    private org.springframework.core.io.Resource resource;//import org.springframework.core.io.Resource;

    public static class ImageRequest {
        public String base64Image; // 接收纯 Base64 字符串，去掉 "data:image/xxx;base64,"
    }

    @GetMapping(value = "/hello")
    public String hello(@RequestParam(value = "question",defaultValue = "你是什么版本的,请你详细的说说你的版本型号") String question) {
        String result = QwenVLMaxchatModel.chat(question);
        System.out.println("result = " + result);
        return result;
    }

    @PostMapping(value = "/imageocr", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String imageOcr(@RequestPart("image") MultipartFile imageFile) throws IOException {
        // 1. 将图片文件转成 Base64 字符串
        String base64Image = Base64.getEncoder().encodeToString(imageFile.getBytes());
        // 2. 组织 prompt，告诉模型这是图片的 base64 内容，请帮我识别文字
        String prompt = "这是图片的Base64编码，请你原文输出图片上的文字内容，不要多说任何无关内容。\nBase64:" + base64Image;
        // 3. 调用模型接口
        String result = QwenVLMaxchatModel.chat(prompt);
        System.out.println("OCR result: " + result);
        // 4. 返回结果
        return result;
    }

    /*
    * 实现上传图片实现ocr的识别和返回操作
    * */
    @GetMapping(value = "/image/call")
    public String readImageContent() throws IOException
    {

        byte[] byteArray = resource.getContentAsByteArray();
        String base64Data = Base64.getEncoder().encodeToString(byteArray);

        UserMessage userMessage = UserMessage.from(
                TextContent.from("请你原文输出图片上的文字内容，不要多说任何无关内容,直接原文输出不要添加任何一点的废话"),
                ImageContent.from(base64Data,"image/jpg")
        );

        ChatResponse chatResponse = QwenVLMaxchatModel.chat(userMessage);
        String result = chatResponse.aiMessage().text();
        System.out.println(result);
        return result;
    }

    /*
    * 此时上传上来的是base64编码的图片,然后实现文本的识别操作
    * */
    @PostMapping("/base64upload")
    public String readImageContent(@RequestBody ImageRequest request) {
        // 1. 如果前端传的带头部，比如 ""
        //    你需要先去除头部
        String base64Data = request.base64Image;
        if (base64Data.contains(",")) {
            base64Data = base64Data.substring(base64Data.indexOf(",") + 1);
        }
        // 2. 构造多模态消息
        UserMessage userMessage = UserMessage.from(
                TextContent.from("请你原文输出图片上的文字内容，不要多说任何无关内容，直接原文输出不要添加任何一点的废话"),
                ImageContent.from(base64Data, "image/jpg")
        );
        // 3. 调用模型接口
        ChatResponse chatResponse = QwenVLMaxchatModel.chat(userMessage);
        // 4. 返回模型结果
        String result = chatResponse.aiMessage().text();
        System.out.println("识别结果: " + result);
        return result;
    }
}
